템플릿 메소드 패턴, 도대체 왜 쓰는거야? - 기본 이론편

템플릿 메소드 패턴 파헤치기

Posted by Yungwang Ryu on 2019-05-15

템플릿 메소드 패턴이란?

메소드 안에 규격화된 로직 또는 단계를 정의해놓고 그 규격화된 단계를 바탕으로 로직을 구현하는 패턴이며 포괄하고 있는 메서드를 템플릿 메서드라 한다.
일부 단계에서는 서브클래스에서 입맛에 맞게 로직을 구현하되 전체적인 템플릿(틀, 규격화된 로직)은 그대로 유지된다.

언제 사용할까?

예를 들어보자 토니스타크가 아이언맨 슈트를 자동으로 착용하는 장면을 상상해 보자
자비스는 토니스타크에게 아래와 같은 순서로 착용해 줄 것이다.

다리 -> 가슴 -> 팔 -> 머리

그렇다 어떤 아이언맨 슈트라도 위 부분 순서데로 장착이 되는 것이다. 그럼 아이언맨 슈트 장착 명령을 자비스에게 내리기 위해 프로그램을 구상해 보자

순서는 다리, 가슴, 팔, 머리다. 어떤 아이언맨 슈트라도 말이다. 항상 저 순서데로라고 하면 그 순서를 규격화 템플릿화 해놓으면 순서가 꼬일 일도 없지 않을까?? 그리고 아이언맨 슈트별 각 단계에서 이루어지는 설정이 조금씩 다르더라고 그건 서브클래스에서 구현하면 되고 슈트가 장착 되는 순서는 어찌됬든 똑같은 것이다.

이대목에서 바로 템플릿 메소드 패턴을 사용하는 것이다.

코드로 구현해 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class AbstractAssembl {

// 바로 여기가 템플릿 메소드이다.
final void 슈트조립() {
다리();
가슴();
팔();
머리();
}

abstract 머리();

void 다리() {
..
}

void 가슴() {
..
}

void 팔() {
..
}
}

후크

아이언맨 슈트를 조립하는 템플릿 메소드는 만들었다. 근데 옵션으로 5개의 인피니티 스톤을 장착 할 수 있는 건틀렛을 끼고 싶을때 끼고 끼고 싶지 않을때 빼는 기능을 템플릿 메소드에 추가하려면 어떻게 해야 할까??
이부분이 후크가 필요한 기능이다. 아래 코드를 다시 보면 금방 이해가 될 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
abstract class AbstractAssembl {

// 바로 여기가 템플릿 메소드이다.
final void 슈트조립() {
다리();
가슴();
팔();
머리();
if(인피니티 건틀렛 사용 여부){
인피니티 건틀렛();
}
}

abstract 머리();

void 다리() {
..
}

void 가슴() {
..
}

void 팔() {
..
}

// 이부분이 후크이다. 기본적으로 껍데기로 true 처리하고
// 후크를 사용하려면 서브클래스에서 오버라이드 해야한다.
boolean 인피니티 건틀렛 사용 여부(){
return true;
}
}